package pers.cz.json;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
 * @program: PostGirl-panent
 * @description: GsonUtil
 * @author: Cheng Zhi
 * @create: 2021-03-15 21:14
 **/
public class GsonUtil {

    public static JsonElement replaceKey(JsonElement source,Map<String, String> rep) {

        if (source == null || source.isJsonNull()) {
            return JsonNull.INSTANCE;
        }
        if (source.isJsonPrimitive()) {
            return source;
        }
        if (source.isJsonArray()) {
            JsonArray jsonArr = source.getAsJsonArray();
            JsonArray jsonArray = new JsonArray();
            jsonArr.forEach(item -> {
                jsonArray.add(replaceKey(item, rep));
            });
            return jsonArray;
        }
        if (source.isJsonObject()) {
            JsonObject jsonObj = source.getAsJsonObject();
            Iterator<Entry<String, JsonElement>> iterator = jsonObj.entrySet().iterator();
            JsonObject newJsonObj = new JsonObject();
            iterator.forEachRemaining(item -> {
                String key = item.getKey();
                JsonElement value = item.getValue();
                if (rep.containsKey(key)) {
                    String newKey = rep.get(key);
                    key = newKey;
                }
                newJsonObj.add(key, replaceKey(value, rep));
            });

            return newJsonObj;
        }
        return JsonNull.INSTANCE;
    }

    public static void main(String[] args) {
        String json = "{\"order_sn\":\"14031000273822\",\"carriers_code\":1100000357,\"carrier\":\"浙江派尔快递\",\"package_type\":2,\"packages\":[{\"0\":{\"good_sn\":\"ALM2236W36\",\"amount\":\"2\"},\"1\":{\"good_sn\":\"ALM2236W37\",\"amount\":\"2\"},\"transport_no\":\"test5715A\"},{\"0\":{\"good_sn\":\"ALM2236W35\",\"amount\":\"2\"},\"transport_no\":\"test5715B\"}]}";
        JsonElement jsonEle = new JsonParser().parse(json);
        HashMap<String, String> rep = new HashMap<String, String>();
        rep.put("order_sn", "order_id");
        rep.put("carriers_code", "carrier_code");
        rep.put("good_sn", "barcode");
        JsonElement replaceKey = replaceKey(jsonEle, rep);
        System.out.println(replaceKey.toString());

    }

}
